#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mqueue.h>
#include <string.h>
#include <time.h>

int main(void){
  char *mq_name="/p_c_mq";
  struct mq_attr attr;
  attr.mq_curmsgs=0;
  attr.mq_flags=0;
  attr.mq_maxmsg=10;
  attr.mq_msgsize=100;
  // 创建或打开
  int mqd = mq_open(mq_name,O_CREAT|O_WRONLY,0644,&attr);
  if(mqd==-1){
    perror("mq_open");
    exit(EXIT_FAILURE);
  }
  char write_buff[100]={0};
  struct timespec time_info;
  size_t read_count=0;

  // 一直发送，直到不想发
  while(1){
    memset(write_buff,0,100);
    read_count = read(STDIN_FILENO,write_buff,100);
      if(read_count==-1){
        perror("read");
        continue;
      }
        // 准备超时时间
      clock_gettime(0,&time_info);
      time_info.tv_sec+=5;//设置5秒超时      
      // 生产者用户在控制台按了ctrl+d,结束输入
      if(read_count==0){
        printf("生产者不想再发送数据了，按了停止键\n");
        char eof = EOF;
        // 将结束通信的标记发送给消费者
        if(mq_timedsend(mqd,&eof,1,0,&time_info)==-1){
          perror("mq_timedsend");
        }
        printf("已经向消费者端发送停止通行的指令\n");
        break;
      }else{ // 常规消息发送 
        if(mq_timedsend(mqd,write_buff,strlen(write_buff),0,&time_info)==-1){
          perror("mq_timedsend");
        }
        printf("从命行接收到数据%s,已经发送给消费者端\n",write_buff);
      }      
  }
  // 通信结束后，关闭消息队列描述符
  close(mqd);
  // 不要unlink,由消费者端操作
  return 0;
}
